#ifndef SZNR103PARSER_H
#define SZNR103PARSER_H

#include <QString>
#include "SZNR/SZNRAsduParser.h"
#include "SZNR103_Type.h"
#include "SZNR/SZNR103_Type.h"
#include <QObject>

class SZNR103Parser: public QObject
{
    Q_OBJECT

public:
    SZNR103Parser(QObject *parent=nullptr);
    ~SZNR103Parser();

    // 解析控制域code的 prm、 ACD、 DFC、 功能码
    void parseCode(QByteArray code, char &prm, char &fcb, char &dfc, int &funCode);

    // 解析功能码类型，参数：功能码序号 0~15
    int parsefunCodeType(int& funCode);

    // 检查接收到的报文， 报文头、 两个长度L一致、接收字符长度 L+6*2
    bool recvFrameCheck(QByteArray& packet);

    // 原始报文中按照asdu占用位置分割出来，获取链路用户数据，然后调用 asdu 解析接口即可解析出数据
    QByteArray getAsdu(QByteArray& packet);

    int parserType(QByteArray& packet);  //确认报文类型， 0：固定帧， 1：带有asdu数据

    // 无所召唤的数据固定帧: 10 09 01 0A 16 ，功能码09， 在读取定值信息的时候，到最后没有数据了保护回该帧报文提示主站请求完毕
    int parseFixedFrame(QByteArray& packet); // 解析10开头的固定帧报文, 返回值： 9（无召唤的数据了，一次请求结束的标志）

    int parseAsduFrame(QByteArray& packet);

    QMap<QString, BillTableStruct> getTableInfo();

    void clearParseResultBuffer();      // 在需要重新读取的时候，就要清理上一次的缓存结果

signals:
    void sig_noDataResponse();
    void sig_reTry();   // 重复发送上一帧命令
    void sig_sureResponse();
    void sig_responForRequest();    // 响应请求帧

private:
     SZNRAsduParser m_asduPaser;      // asdu 解析工具类
     int m_recvIndex;  // 发送报文序号，某些时候最开始给保护发送的第一条命令可能保护无反应，避免立马就结束，需要重新发送第一条
};

#endif // SZNR103PARSER_H
